import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

///预测性解析：petitparser 支持预测性解析，它可以在解析时查看输入的未来部分，而不消耗它。
///petitparser 的所有解析器都是预测性的，因为它们都可以查看输入的未来部分，而不消耗它。
///这是因为 petitparser 使用的是 LL(*) 解析算法，它可以无限制地向前看输入，以决定如何进行解析。
class ElookaheadParser extends StatefulWidget {
  const ElookaheadParser({super.key});

  @override
  State<ElookaheadParser> createState() => _ElookaheadParserState();
}

class _ElookaheadParserState extends State<ElookaheadParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('预测性解析'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text('待解析数据"ab" 、"ac"、"ad"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

  void _buildParser() {
    resultStr = '';
    // 创建一个解析器，它期望看到一个 'a'，后面是 'b' 或 'c'
    final parser = char('a').seq(char('b').or(char('c')));

    // 应该成功解析 "ab"，并返回 ['a', 'b']
    final result1 = parser.parse('ab');
    if (result1.isSuccess) {
      resultStr = result1.value.toString();
      print('Parsed successfully: ${result1.value}');
    } else {
      resultStr = 'Parse failed: ${result1.message}';
      print('Parse failed: ${result1.message}');
    }

    // 应该成功解析 "ac"，并返回 ['a', 'c']
    final result2 = parser.parse('ac');
    if (result2.isSuccess) {
      resultStr = '$resultStr\n\n${result2.value}';
      print('Parsed successfully: ${result2.value}');
    } else {
      resultStr = '$resultStr\n\nParse failed: ${result2.message}';
      print('Parse failed: ${result2.message}');
    }

    // 应该无法解析 "ad"，因为它期望在 "a" 后面看到的是 "b" 或 "c"
    final result3 = parser.parse('ad');
    if (result3.isSuccess) {
      resultStr = '$resultStr\n\n${result3.value}';
      print('Parsed successfully: ${result3.value}');
    } else {
      resultStr = '$resultStr\n\nParse failed: ${result3.message}';
      print('Parse failed: ${result3.message}');
    }
  }
}
